package com.dys.controller;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @className: com.dys.controller.FileUploadController
 * @description: com.dys.controller
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/10/27 18:52
 */
@Controller
public class FileUploadController {
    // 文件存储位置
    private final static String FILESERVER = "http://192.168.3.5:8090/upload/";

    @ResponseBody
    @RequestMapping(value = "/fileUpload.do", method = RequestMethod.POST)
    public String fileUpload(@RequestParam("headPhoto") MultipartFile headPhoto) throws IOException {
        // 1.指定文件存储目录
        File dir = new File("D:/spring_log");
        // 2.获取文件名
        String filename = headPhoto.getOriginalFilename();
        // 3.文件存储位置
        File fileTo = new File(dir, filename);
        // 4.保存文件
        headPhoto.transferTo(fileTo);
        return "OK";
    }

    @ResponseBody
    @RequestMapping(value = "/fileUpload2.do", method = RequestMethod.POST)
    public String fileUpload2(@RequestParam("headPhoto") MultipartFile headPhoto, HttpServletRequest req) throws IOException {
        String realPath = req.getServletContext().getRealPath("/upload");
        // 1.指定文件存储目录
        File dir = new File(realPath);
        // 如果目录不存在就创建目录
        if (!dir.exists()) {
            dir.mkdirs();
        }
        // 2.获取文件名(注意：相同的文件名，后上传的会替换先上传的文件)
        String filename = headPhoto.getOriginalFilename();
        // 3.文件存储位置
        File fileTo = new File(dir, filename);
        // 4.保存文件
        headPhoto.transferTo(fileTo);
        return "OK";
    }

    @ResponseBody
    @RequestMapping(value = "/fileUpload3.do", method = RequestMethod.POST)
    public String fileUpload3(@RequestParam("headPhoto") MultipartFile headPhoto, HttpServletRequest req) throws IOException {
        String realPath = req.getServletContext().getRealPath("/upload");
        // 1.指定文件存储目录
        File dir = new File(realPath);
        // 如果目录不存在就创建目录
        if (!dir.exists()) {
            dir.mkdirs();
        }
        // 2.获取文件名(注意：相同的文件名，后上传的会替换先上传的文件)
        String filename = headPhoto.getOriginalFilename();
        // 生成UUID
        String uuid = UUID.randomUUID().toString();
        String extendsName = filename.substring(filename.lastIndexOf("."));
        // 处理后的文件名
        String newFileName = uuid.concat(extendsName);
        // 3.文件存储位置
        File fileTo = new File(dir, newFileName);
        // 4.保存文件
        headPhoto.transferTo(fileTo);
        return "OK";
    }

    @ResponseBody
    @RequestMapping(value = "/fileUpload4.do", method = RequestMethod.POST)
    public Map<String, String> fileUpload4(@RequestParam("headPhoto") MultipartFile headPhoto, HttpServletRequest req) throws IOException {
        Map<String, String> map = new HashMap<>();
        // 控制文件大小
        if (headPhoto.getSize() > 1024 * 1024 * 5) {
            map.put("message", "文件大小不能超过5MB");
            return map;
        }
        String realPath = req.getServletContext().getRealPath("/upload");
        // 1.指定文件存储目录
        File dir = new File(realPath);
        // 如果目录不存在就创建目录
        if (!dir.exists()) {
            dir.mkdirs();
        }
        // 2.获取文件名(注意：相同的文件名，后上传的会替换先上传的文件)
        String filename = headPhoto.getOriginalFilename();
        // 生成UUID
        String uuid = UUID.randomUUID().toString();
        String extendsName = filename.substring(filename.lastIndexOf("."));
        // 控制文件类型
        if (!extendsName.equals(".jpg") && !extendsName.equals(".png")) {
            map.put("message", "文件类型必须是.jpg或者.png");
            return map;
        }
        // 处理后的文件名
        String newFileName = uuid.concat(extendsName);
        // 3.文件存储位置
        File fileTo = new File(dir, newFileName);
        // 4.保存文件
        headPhoto.transferTo(fileTo);
        // 上传成功之后,把文件的名字和文件的类型返回给浏览器
        map.put("message", "文件上传成功");
        map.put("newFileName", newFileName);
        map.put("fileType", headPhoto.getContentType());
        return map;
    }

    @ResponseBody
    @RequestMapping(value = "/fileUpload5.do", method = RequestMethod.POST)
    public Map<String, String> fileUpload5(@RequestParam("headPhoto") MultipartFile headPhoto, HttpServletRequest req) throws IOException {
        Map<String, String> map = new HashMap<>();
        // 控制文件大小
        if (headPhoto.getSize() > 1024 * 1024 * 5) {
            map.put("message", "文件大小不能超过5MB");
            return map;
        }
        // 2.获取文件名(注意：相同的文件名，后上传的会替换先上传的文件)
        String filename = headPhoto.getOriginalFilename();
        // 生成UUID
        String uuid = UUID.randomUUID().toString();
        String extendsName = filename.substring(filename.lastIndexOf("."));
        // 控制文件类型
        if (!extendsName.equals(".jpg") && !extendsName.equals(".png")) {
            map.put("message", "文件类型必须是.jpg或者.png");
            return map;
        }
        // 处理后的文件名
        String newFileName = uuid.concat(extendsName);
        // 3.文件存储位置
        // 创建 sun公司提供的jersey包中的client对象
        Client client = Client.create();
        WebResource webResource = client.resource(FILESERVER + newFileName);
        // 4.保存文件
        //  文件保存到另一个服务器上去了
        webResource.put(String.class, headPhoto.getBytes());
        // 上传成功之后,把文件的名字和文件的类型返回给浏览器
        map.put("message", "文件上传成功");
        map.put("newFileName", FILESERVER + newFileName);
        map.put("fileType", headPhoto.getContentType());
        return map;
    }

    @ResponseBody
    @RequestMapping(value = "/fileUpload6.do", method = RequestMethod.POST)
    public Map<String, String> fileUpload6(@RequestParam("headPhoto") MultipartFile headPhoto, HttpServletRequest req) throws IOException {
        Map<String, String> map = new HashMap<>();
        // 控制文件大小
        if (headPhoto.getSize() > 1024 * 1024 * 5) {
            map.put("message", "文件大小不能超过5MB");
            return map;
        }
        // 2.获取文件名(注意：相同的文件名，后上传的会替换先上传的文件)
        String filename = headPhoto.getOriginalFilename();
        // 生成UUID
        String uuid = UUID.randomUUID().toString();
        String extendsName = filename.substring(filename.lastIndexOf("."));
        // 控制文件类型
        if (!extendsName.equals(".jpg") && !extendsName.equals(".png")) {
            map.put("message", "文件类型必须是.jpg或者.png");
            return map;
        }
        // 处理后的文件名
        String newFileName = uuid.concat(extendsName);
        // 3.文件存储位置
        // 创建 sun公司提供的jersey包中的client对象
        Client client = Client.create();
        WebResource webResource = client.resource(FILESERVER + newFileName);
        // 4.保存文件
        //  文件保存到另一个服务器上去了
        webResource.put(String.class, headPhoto.getBytes());
        // 上传成功之后,把文件的名字和文件的类型返回给浏览器
        map.put("message", "文件上传成功");
        map.put("newFileName", newFileName);
        map.put("fileType", headPhoto.getContentType());
        return map;
    }

    @RequestMapping("/fileDownload.do")
    public void fileDownload(String photo, String fileType, HttpServletResponse resp) throws IOException {
        // 设置响应头
        // 告诉浏览器要将数据保存在磁盘上，不要在浏览器上直接解析
        resp.setHeader("Content-Disposition", "attachment;filename=" + photo);
        // 告诉浏览器下载的文件类型
        resp.setContentType(fileType);
        // 获取一个文件的输入流
        InputStream is = new URL(FILESERVER + photo).openStream();
        // 获取一个只想浏览器的输出流
        ServletOutputStream outputStream = resp.getOutputStream();
        // 向浏览器响应文件即可
        FileCopyUtils.copy(is, outputStream);
    }
}
